﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using StoragePeriod.COMP;

namespace StoragePeriod.COMP.CharHand
{
    /// <summary>
    /// 功能简介：类型成员统一进行安全过滤的工具类
    /// 创建人：pengchenwang
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class ModelValide<T> where T:new()
    {
        /// <summary>
        /// 将对象各成员进行sql危险字符串过滤
        /// 注（如果对象的成员变量是非字符串，则不予处理，建议把子对象用本方法单独执行
        /// </summary>
        /// <param name="eModel">待sql安全过滤的对象</param>
        /// <returns>已经过sql安全过滤的对象</returns>
        public T GetSafeModelForSql(T eModel)
        {
            string sSafeValue="";
            object obj=null;
            foreach (PropertyInfo propertyInfo in typeof(T).GetProperties())//依次处理对象的各个成员变量的值
            {
                if (propertyInfo.PropertyType.FullName != "System.String")
                    continue;

                if (!propertyInfo.CanWrite)
                    continue;

                obj= propertyInfo.GetValue(eModel, null);
                if (obj == null)
                    continue;

                sSafeValue= StringUtil.safeSql(obj.ToString());//如果包含危险字符，则对它进行替换
                propertyInfo.SetValue(eModel, sSafeValue, null);
            }
            return eModel;//返回一个安全的对象
        }

        /// <summary>
        /// 将对象各成员进行sql危险字符串过滤(对于编辑器提交的结果进行特殊处理)
        /// 注（如果对象的成员变量是非字符串，则不予处理，建议把子对象用本方法单独执行
        /// </summary>
        /// <param name="eModel">待sql安全过滤的对象</param>
        /// <param name="strFCkEditorPropertys">使用了编辑器的字段名称，多个请用英文逗号隔开,如果没有则可以传入null</param>
        /// <returns>已经过sql安全过滤的对象</returns>
        public T GetSafeModelFromFckEditorForSql(T eModel,string [] strFCkEditorPropertys)
        {
            string sSafeValue = "";
            object obj = null;
            foreach (PropertyInfo propertyInfo in typeof(T).GetProperties())//依次处理对象的各个成员变量的值
            {
                if (propertyInfo.PropertyType.FullName != "System.String")
                    continue;
                if (!propertyInfo.CanWrite)
                    continue;
                obj = propertyInfo.GetValue(eModel, null);
                if (obj == null)
                    continue;
                if (strFCkEditorPropertys!=null&& strFCkEditorPropertys.Contains(propertyInfo.Name))
                {
                    sSafeValue = StringUtil.safeSqlForFckEditor(obj.ToString());//如果包含危险字符，则对它进行替换
                }
                else
                {
                    sSafeValue = StringUtil.safeSql(obj.ToString());//如果包含危险字符，则对它进行替换
                }
                propertyInfo.SetValue(eModel, sSafeValue, null);
            }
            return eModel;//返回一个安全的对象
        }
    }
}
